

#include <iostream>
using namespace std;

//int main()
//{
//	int a = 0;
//	int* p = &a;
//	auto p1 = &a;
//	auto* p2 = &a;
//
//	cout << typeid(p).name() << endl;
//	cout << typeid(p1).name() << endl;
//	cout << typeid(p2).name() << endl;
//
//	auto& p3 = a;
//	cout << typeid(p3).name() << endl;
//
//	int b = 0;
//	auto p4 = b;
//	p4 = 1;
//	cout << typeid(p4).name() << " " << b << " " << p4 << endl;
//
//	auto& p5 = b;
//	p5 = 1;
//	cout << typeid(p5).name() << " " << b << " " << p5 << endl;
//
//	return 0;
//}

//int f1(void)
//{
//	return 1;
//}
//
//auto f2(void)
//{
//
//}
//
//auto f3(void)
//{
//	return 1.1;
//}
//
////int f4(auto a)// err
////{
////	int b = a;
////
////	return b;
////}
//
//int main()
//{
//	int a = 10;
//	auto b = a;
//	auto c = f1();
//	auto d = 'a';
//	//auto e;// err
//
//	cout << typeid(a).name() << endl;
//	cout << typeid(b).name() << endl;
//	cout << typeid(c).name() << endl;
//	cout << typeid(d).name() << endl << endl;
//
//	int x = 10;
//	auto y = &x;
//	auto* z = &x;
//	auto& rx = x;
//
//	cout << typeid(x).name() << endl;
//	cout << typeid(y).name() << endl;
//	cout << typeid(z).name() << endl;
//	cout << typeid(rx).name() << endl << endl;
//
//	auto aa = 1, bb = 2;
//	//auto cc = 1, dd = 3.3;
//	/*int i = 2.2;
//	cout << i << endl;*/
//
//	//auto arr[] = { 1, 2, 3 }; // err
//	cout << typeid(f2()).name() << endl;
//	cout << typeid(f3()).name() << endl;
//
//	return 0;
//}


//#include <string>
//int main()
//{
//	int a[] = { 1, 2, 3, 4, 5 };
//
//	for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i)
//	{
//		a[i] *= 2;
//		cout << a[i] << " ";
//	}
//	cout << endl;
//
//	string str("hello world!");
//	for (auto& ch : str)
//	{
//		ch += 1;
//		cout << ch << " ";
//	}
//	cout << endl;
//
//	return 0;
//}

//int main()
//{
//	auto c = "hello world!";
//	cout << typeid(c).name() << endl;
//
//	return 0;
//}

//int main()
//{
//	auto a = "hello";
//	cout << typeid(a).name() << endl;
//	cout << typeid("hello").name() << endl;
//
//	return 0;
//}

//#include <string>
//int main()
//{
//	string s1;
//	string s2("hello world!");
//	string s3(10, 'x');
//	string s4(s2);
//
//	cout << s2.size() << endl;
//	cout << s2.length() << endl;
//	cout << s2.capacity() << endl;
//	cout << s2.empty() << endl << endl;
//
//	s2.clear();
//	cout << s2.size() << endl;
//	cout << s2.capacity() << endl;
//	cout << s2.empty() << endl << endl;
//
//	string s5;
//	s5.reserve(100);
//	s5 = "hello linux!";
//	cout << s5.size() << endl;
//	cout << s5.capacity() << endl;
//	cout << s5.empty() << endl << endl;
//
//	s5.resize(50);
//	cout << s5.size() << endl;
//	cout << s5.capacity() << endl;
//	cout << s5.empty() << endl << endl;
//
//	s5.resize(4);
//	cout << s5.size() << endl;
//	cout << s5.capacity() << endl;
//	cout << s5.empty() << endl << endl << endl;
//
//	return 0;
//}


//#include <string>
//int main()
//{
//	string s("hello world!");
//
//	cout << s.size() << endl;
//	cout << s.capacity() << endl << endl;
//
//	s.resize(20);
//	cout << s.size() << endl;
//	cout << s.capacity() << endl << endl;
//
//	s.resize(3);
//	cout << s.size() << endl;
//	cout << s.capacity() << endl << endl;
//
//	return 0;
//}

//#include <string>
//void Test1()
//{
//	string s;
//	s = "hello";
//
//	s.reserve(100);
//	cout << s.size() << endl;
//	cout << s.capacity() << endl << endl;
//
//	s.resize(3);
//	cout << s.size() << endl;
//	cout << s.capacity() << endl;
//}
//
//void TestPushback()
//{
//	string s;
//	size_t sz = s.capacity();
//	cout << sz << endl << endl;
//
//	cout << "making s'capacity grow:\n";
//	for (int i = 0; i < 100; ++i)
//	{
//		//s.push_back('c');
//		s += 'c';
//		if (sz != s.capacity())
//		{
//			sz = s.capacity();
//			cout << "capacity changed:" << sz << endl;
//		}
//	}
//}
//
//void TestReserve()
//{
//	string s;
//
//	s.reserve(100);
//	size_t sz = s.capacity();
//	cout << sz << endl << endl;
//
//	cout << "making s'capacity grow\n";
//	for (int i = 0; i < 100; ++i)
//	{
//		s += 'c';
//		if (sz != s.capacity())
//		{
//			sz = s.capacity();
//			cout << "capacity changed:" << sz << endl;
//		}
//	}
//}
//
//int main()
//{
//	//Test1();
//	//TestPushback();
//	TestReserve();
//
//	return 0;
//}

#include <string>
void Test1(void)
{
	string s1("hello,world!");
	const string s2("hello,linux!");

	cout << s1 << "	" << s2 << endl;
	cout << s1[0] << " " << s2[0] << endl;

	s1[0] = 't';
	//s2[0] = 't';
	cout << s1 << "	" << s2 << endl;
}

void Test2()
{
	const char* pc = "hello world!";
	string s(pc);

	for (int i = 0; i < s.size(); ++i)
	{
		cout << s[i] << " ";
	}
	cout << endl;
	s = pc;
	for (int i = 0; i < s.size(); ++i)
	{
		s[i] -= 1;
		cout << s[i] << " ";
	}
	cout << endl << endl;

	s = pc;
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	s = pc;
	it = s.begin();
	while (it != s.end())
	{
		*it -= 1;
		cout << *it << " ";
		++it;
	}
	cout << endl << endl;

	s = pc;
	auto rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit << " ";
		*rit -= 1;
		++rit;
	}
	cout << endl;
	string::reverse_iterator rit2 = s.rbegin();
	while (rit2 != s.rend())
	{
		cout << *rit2 << " ";
		++rit2;
	}
	cout << endl << endl;

	s = pc;
	for (auto& ch : s)
	{
		cout << ch << " ";
		ch -= 1;
	}
	cout << endl;
	for (auto& ch : s)
	{
		cout << ch << " ";
	}
	cout << endl;
}

void Test3(void)
{
	string s("hello");
	cout << s.size() << endl;

	string s2 = s.substr(4);
	cout << s2 << " " << s2.size() << endl;
}

void Test4(void)
{
	string s1;

	s1.append(5, 'x');
	cout << s1.c_str() << endl;

	s1 += 'c';
	s1 += "test";
	s1.push_back('d');
	cout << s1.c_str() << endl;

	string url("https://legacy.cplusplus.com/reference/string/string/?kw=string");
	size_t beg = url.find("://");
	if (beg != string::npos)
	{
		beg += 3;
		string sub = url.substr(beg);
		cout << sub.c_str() << endl;
	}

	size_t end = url.rfind("/?");
	if (end != string::npos)
	{
		string sub2 = url.substr(end + 2);
		cout << sub2 << endl;
	}

	string file("string.cpp");
	size_t pos = file.rfind('.');
	if (pos != string::npos)
	{
		string suffix(file.substr(pos+1, file.size()-(pos+1)));
		cout << suffix << endl;
	}

	cout << url << endl << endl;

	url.erase(0, beg);
	cout << url << endl;
}

int main()
{
	//Test1();
	//Test2();
	//Test3();
	Test4();

	return 0;
}